手把手教你写一个服务器监控脚本,自动告警,简单又实用!

大家好,我是你们的老朋友。最近有朋友跟我吐槽,说他的小网站老是莫名其妙挂掉,等发现的时候已经过去半天了,损失惨重。其实很多个人站长或者小团队都会遇到这个问题——服务器出了故障不能第一时间知道。这时候,一个简单的监控脚本就显得尤为重要了。今天我就手把手教大家写一个服务器监控脚本,用Python实现,功能包括每分钟记录CPU负载、内存使用、磁盘空间,超出阈值时发送告警,代码简单易懂,稍加修改就能用在生产环境。

为什么需要自己写监控?

大部分云服务商都提供监控服务,但很多都是收费的,或者配置起来比较复杂。对于个人项目或者预算有限的小团队,自己写一个脚本既省钱又灵活。而且通过自己写脚本,你能更深入地了解服务器的状态指标,甚至可以根据自己的需求定制告警方式,比如发邮件、发钉钉通知等。我的这个脚本最初就是为了监控一台低配服务器,防止磁盘写满导致服务中断。后来发现,自己写的监控虽然简陋,但胜在可控,想加什么功能就加什么功能。

脚本功能预览

这个脚本会做以下几件事:

  • 每分钟采集一次CPU负载、内存使用率和磁盘使用率
  • 将采集到的数据记录到日志文件,方便回溯
  • 当任意指标超过设定阈值时,输出告警信息到终端(也可以扩展为发送邮件或消息)
  • 简单轻量,只依赖psutil一个第三方库,安装方便

阈值设定经验分享

阈值设得太低容易误报,设得太高又起不到预警作用。我一般这样设置:CPU使用率阈值设为80%,内存使用率设为80%,磁盘使用率设为90%。为什么磁盘可以设高一点?因为磁盘空间通常不是突然暴涨,90%的时候开始告警,你还有10%的空间可以缓冲处理。当然,如果你的服务器内存很小(比如1G),内存阈值可以降到70%。这些都可以根据实际情况调整,脚本里修改对应的变量就行。

完整代码实现

下面就是完整的Python脚本,我加了详细的注释,大家可以复制后直接运行。注意脚本使用了psutil库来获取系统信息,运行前需要安装(命令在后面)。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
服务器监控脚本
功能:每分钟记录CPU负载、内存使用、磁盘空间,超阈值告警
依赖:psutil (pip install psutil)
"""
import time
import psutil
import logging
from datetime import datetime
# 配置日志
logging.basicConfig(
filename='server_monitor.log',
level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
# 阈值设置(可根据需要调整)
CPU_THRESHOLD = 80.0          # CPU使用率百分比阈值
MEMORY_THRESHOLD = 80.0       # 内存使用率百分比阈值
DISK_THRESHOLD = 90.0         # 磁盘使用率百分比阈值
def get_cpu_load():
"""获取CPU使用率(间隔1秒取平均)"""
return psutil.cpu_percent(interval=1)
def get_memory_usage():
"""获取内存使用率"""
mem = psutil.virtual_memory()
return mem.percent
def get_disk_usage():
"""获取根分区磁盘使用率"""
disk = psutil.disk_usage('/')
return disk.percent
def check_thresholds(cpu, mem, disk):
"""检查是否超过阈值,超过则记录告警"""
alerts = []
if cpu > CPU_THRESHOLD:
msg = f"CPU使用率过高: {cpu}% (阈值 {CPU_THRESHOLD}%)"
alerts.append(msg)
logging.warning(msg)
if mem > MEMORY_THRESHOLD:
msg = f"内存使用率过高: {mem}% (阈值 {MEMORY_THRESHOLD}%)"
alerts.append(msg)
logging.warning(msg)
if disk > DISK_THRESHOLD:
msg = f"磁盘使用率过高: {disk}% (阈值 {DISK_THRESHOLD}%)"
alerts.append(msg)
logging.warning(msg)
return alerts
def log_status(cpu, mem, disk):
"""将当前状态记录到日志"""
logging.info(f"CPU: {cpu}% | 内存: {mem}% | 磁盘: {disk}%")
def main():
print("服务器监控脚本已启动,按 Ctrl+C 停止。")
while True:
cpu = get_cpu_load()
mem = get_memory_usage()
disk = get_disk_usage()
# 记录状态
log_status(cpu, mem, disk)
# 检查告警
alerts = check_thresholds(cpu, mem, disk)
if alerts:
print("\n".join(alerts))  # 在终端打印告警
# 可在此扩展发送邮件或消息通知
# 等待60秒
time.sleep(60)
if __name__ == "__main__":
main()

代码解读

脚本核心是三个采集函数:get_cpu_loadget_memory_usageget_disk_usage,它们分别调用psutil的对应方法。注意CPU使用率采集时设置了interval=1,会等待1秒取平均,这样得到的数据更准确。日志模块配置了按天轮转(默认不轮转,但你可以加上RotatingFileHandler),所有状态记录在server_monitor.log中。告警使用logging.warning记录,并同时在终端打印,方便你第一时间看到。

如果你想扩展告警方式,比如发邮件,只需要在check_thresholds函数里调用邮件发送函数即可。代码的结构非常清晰,改起来很方便。

安装与运行

在运行脚本前,需要安装psutil库。执行以下命令:

pip install psutil

然后保存脚本为monitor.py,在终端运行:

python3 monitor.py

脚本会一直运行,每分钟采集一次数据并写入日志文件。如果发现指标超标,会在终端输出告警信息,同时日志中也会记录警告级别。

如何让脚本在后台持续运行

你可以使用nohupscreen让脚本在后台运行。例如:

nohup python3 monitor.py &

或者使用systemd服务来管理,这样更专业。不过对于测试,nohup就足够了。我个人更喜欢用screen,因为可以随时切回去看输出。

另外,你也可以改用cron方式:脚本不写死循环,每次运行只采集一次并退出,然后通过crontab设置每分钟执行一次。这样更符合Unix哲学,而且即使脚本挂了,cron也会重新拉起。示例crontab:

* * * * * /usr/bin/python3 /path/to/monitor.py

不过要注意,cron方式下日志和告警的输出要处理好,否则告警信息可能会以邮件形式发送给你(如果配置了MAILTO)。

进阶扩展思路

这个小脚本已经能满足基本的监控需求,但如果你有更多想法,可以这样扩展:

  • 增加网络流量监控(使用psutil.net_io_counters
  • 将数据写入InfluxDB,并用Grafana展示历史趋势
  • 集成告警通道:邮件、钉钉机器人、企业微信、Slack等
  • 支持多台服务器:通过SSH远程采集或者使用Agent模式

这些扩展需要更多代码,但核心思路是一样的。我个人觉得,对于小项目,先把基础的CPU、内存、磁盘监控好,就能避免90%的故障了。

总结

今天分享的这个小脚本,虽然简单,但确实能帮助我们在第一时间发现服务器异常。我自己的几个项目都靠它提前发现过磁盘快满的问题,避免了服务中断。希望大家能举一反三,根据自己的需求改造它。如果你有更好的想法,欢迎在评论区交流。

最后,如果你正在寻找一台稳定可靠的服务器来运行监控脚本或者其他应用,我推荐试试雨云服务器,性价比高,新用户还有优惠。使用优惠码aabh可以享受折扣,算下来非常划算。反正我用着挺稳的,至少这个脚本跑了半年没出过问题。

好了,今天就聊到这里。如果你觉得这篇文章对你有帮助,不妨点个赞支持一下。我们下期见!

评论区: